\chapter{前言}
Rust是一门系统编程语言。

因为很多业务程序员对系统编程并不是很熟悉，所以这里首先简单解释一下什么是系统编程，为之后的内容奠定基础。

当你合上笔记本电脑时，操作系统检测到了这一行为，然后把所有正在运行的程序挂起、关掉屏幕、并把电脑设置为睡眠；之后，当你打开笔记本电脑时，屏幕和其他组件被再次唤醒，并且每个程序可以在它中断的地方继续运行。我们对此习以为常，但这都多亏了系统程序员为此编写的很多代码。

系统编程被用于以下领域：
\begin{itemize}
    \item 操作系统
    \item 各种设备的驱动
    \item 文件系统
    \item 数据库
    \item 在非常廉价或需要极高的可靠性的设备上运行的代码
    \item 密码学
    \item 多媒体编解码器（用于读写音频、视频、图片文件的软件）
    \item 多媒体处理（例如，语音识别或图像处理软件）
    \item 内存管理（例如，实现一个垃圾回收器）
    \item 文本渲染（把文本和字体转换为像素点的过程）
    \item 实现更高级的编程语言（例如JavaScript和Python）
    \item 网络
    \item 虚拟化和容器
    \item 科学仿真
    \item 游戏
\end{itemize}

简而言之，系统编程是一种\emph{资源受限（resource-constrained）}的编程方式、是一种每个字节和每个CPU时钟都需要考虑的编程方式。仅仅是为了支持一个基本的应用所需要的系统代码的数量也是非常惊人的。

本书并不会教你系统编程。事实上，这本书包含了很多有关内存管理的细节，如果你没有自己进行过系统编程，你会感觉这些内容乍一看似乎没有必要。但如果你是一个熟练的系统程序员，你将会发现Rust是一门非常优秀的语言：它可以解决困扰了整个工业界几十年的主要问题。

\section*{谁应该阅读这本书}
如果你已经是一名系统程序员并且已经准备好替换C++，那么这本书就是为你而生。如果你是一名有其他任何语言的经验的开发者，不管是C\#、Java、Python、JavaScript还是其他语言，这本书同样适用于你。

然而，这阅读这本书的过程中，你需要学习的不止是Rust。为了充分利用这门语言，你还需要一些系统编程的经验。我们推荐在阅读这本书的同时用Rust实现一些系统编程的项目，构建一些你以前从来没有构建过的东西、一些充分利用Rust的速度、并发和安全性的东西。本前言开头的列表也许能给你一些启发。

\section*{我们为什么要撰写这本书}
早在我们开始学习Rust时我们就开始着手编写这本书。我们的目标是首先讲解Rust中主要的、新的概念，清晰而深入地呈现它们，以最大限度地避免通过试错来学习。

\section*{本书概览}
本书的前两章简单地介绍了Rust，并提供了一些简单的示例。之后我们转到\hyperref[ch03]{第3章}的基本数据类型。\hyperref[ch04]{第4章}、\hyperref[ch05]{第5章}专注于介绍所有权和引用的核心概念。我们推荐按照顺序阅读前5章。

第\hyperref[ch06]{6}到第\hyperref[ch10]{10}章覆盖了语言的基础部分：表达式（\hyperref[ch06]{第6章}），错误处理（\hyperref[ch07]{第7章}），crate和模块（\hyperref[ch08]{第8章}），结构体（\hyperref[ch09]{第9章}），枚举和模式（\hyperref[ch10]{第10章}）。在这一部分可以跳过一些内容，但请不要跳过错误处理的章节。\hyperref[ch11]{第11章}包括trait和泛型，这是最后两个必需的重要概念。trait类似于Java或C\#中的接口。它们也是Rust支持把你自己的类型集成到语言中的主要手段。\hyperref[ch12]{第12章}展示了trait怎么支持运算符重载，\hyperref[ch13]{第13章}包括了很多有用的工具trait。

理解了trait和泛型就可以解锁本书的剩余部分了。闭包和迭代器，这两个你绝对不想错过的强大工具，分别在\hyperref[ch14]{第14章}和\hyperref[ch15]{第15章}中介绍。你可以以任意顺序阅读剩下的章节，或者按需阅读。它们包括了剩余的语言部分：集合（\hyperref[ch16]{第16章}），字符串和文本（\hyperref[ch17]{第17章}），输入和输出（\hyperref[ch18]{第18章}），并发（\hyperref[ch19]{第19章}），异步代码（\hyperref[ch20]{第20章}），宏（\hyperref[ch21]{第21章}），unsafe代码（\hyperref[ch22]{第22章}）和调用其它语言中的函数（\hyperref[ch23]{第23章}）。

\section*{本书中的约定}
本书中用到了以下约定：\footnote{译者注：因为我比较懒，所以基本上不会用等宽加粗和等宽斜体这两种字体。}

\hangafter 1
\hangindent 2em
\noindent
\emph{斜体}\\
表示新术语、URL、电子邮件地址、文件名和文件拓展名。

\hangafter 1
\hangindent 2em
\noindent
\texttt{等宽}\\
用于代码环境和在段落中引用代码中的元素例如变量或函数名、数据库、数据类型、环境变量、语句和关键字等。

\hangafter 1
\hangindent 2em
\noindent
\textbf{\texttt{等宽加粗}}\\
表示需要用户逐字输入的命令或其他文本。

\hangafter 1
\hangindent 2em
\noindent
\emph{\texttt{等宽斜体}}\\
表示需要用户用自己的值或者上下文推断出的值进行替换的文本。

\begin{note}
    这个标志表示一个注意事项。
\end{note}

\section*{使用示例代码}
补充材料（示例代码，练习等）可以在\url{https://github.com/ProgrammingRust}下载。

本书旨在帮助你完成工作。一般来说，本书中提供的示例代码都可以直接在自己的编程和文章中使用。除非你需要再次分发大量本书中的代码，否则你不需要联系我们获取授权。例如，编写一个使用了书中部分代码的程序并不需要授权。售卖或者分发O'Reilly书籍中的示例代码则需要授权。通过引用本书或书中的示例代码回答问题并不需要授权。将本书中的大量代码纳入你自己的产品文档则需要授权。

我们感激，但并不要求署名。如果要署名的话，应该包含标题、作者、出版社和ISBN。例如：“Programming Rust, Second Edition by Jim Blandy, Jason Orendorff, and Leonora F.S. Tindall(O’Reilly). Copyright 2021 Jim Blandy, Leonora F.S. Tindall, and Jason Orendorff, 978-1-492-05259-3.”

如果你感觉你对示例代码的使用方式不在上述范围内，请放心联系我们\url{permissions@oreilly.com}。

\section*{O'Reilly在线学习}
\begin{note}
    40多年以来，O'Reilly Media提供技术和业务培训、知识和洞察力，以帮助公司取得成功。
\end{note}

我们独特的专家和创意网络会通过书籍、文章、会议和在线学习平台分享他们的知识。O'Reilly的在线学习平台可以让你按需访问O'Reilly及其他200多家出版社的实时培训课程、深入学习路线、交互式代码环境。更多信息请访问\url{http://oreilly.com}。

\section*{如何联系我们}
请将和本书有关的评论和问题发送给出版社：

\hangafter 0
\hangindent 3em
\noindent
\large{O'Reilly Media, Inc.}\\
\large{1005 Gravenstein Highway North}\\
\large{Sebastopol, CA 95472}\\
\large{800-998-9938 (in the United States or Canada)}\\
\large{707-829-0515 (international or local)}\\
\large{707-829-0104 (fax)}

我们有一个本书的web页面，我们在那里列出了勘误表、示例和其他附加信息。你可以通过\url{https://oreil.ly/programming-rust-2e}访问该页面。

评论或有关本书的技术问题可以发送到邮箱\url{bookquestions@oreilly.com}。

访问\url{http://www.oreilly.com}获取更多有关我们的书籍和课程的信息。

我们的Facebook：\url{http://facebook.com/oreilly}

我们的Twitter：\url{http://twitter.com/oreillymedia}

我们的YouTube：\url{http://youtube.com/oreillymedia}

\section*{致谢}
你手中的这本书从我们的官方技术评审：Brian Anderson、Matt Brubeck、J. David Eisenberg、Ryan Levick、Jack Moffitt、Carol Nichols、Erik Nordin和翻译：Hidemoto Nakada (中田 秀基) (Japanese)、Mr. Songfeng Li (Simplified Chinese)、Adam Bochenek和Krzysztof Sawka (Polish)处受益匪浅。

还有很多非官方的评审阅读了早期的草案并提供了很有价值的反馈。我们想要感谢Eddy Bruel、Nick Fitzgerald、Graydon Hoare、Michael Kelly、Jeffrey Lim、Jakob Olesen、Gian-Carlo Pascutto、Larry Rabinowitz、Jaroslav Šnajdr、Joe Walker、Yoshua Wuyts的认真评论。
Jeff Walden和NicolasPierron花费了宝贵的时间来审阅几乎整本书。就像编程一样，一本编程书籍需要高质量的bug报告才能不断成长。感谢你们。

Mozilla对Jim和Jason在此项目中的工作非常宽容，尽管这超出了我们的官方职责范围，并会和他们产生竞争。我们非常感谢Jim和Jason的领导：Dave Camp、Naveed Ihsanullah、Tom Tromey、Joe Walker的支持。他们从长远的角度看待Mozilla，我们希望这些结果证明了他们对我们的信任。

我们还想对O'Reilly里每个帮助过我们的人表达感谢，尤其是非常有耐心的编辑Jeff Bleiel和Brian MacDonald，以及我们的策划编辑Zan McQuade。

最重要的是，我们衷心感谢家人们坚定不移的爱、热情和耐心。